package com.aiapphub.SystemCode.service;

import com.aiapphub.BaseCode.entity.SsoUser;
import com.aiapphub.BaseCode.exception.SystemException;
import com.aiapphub.BaseCode.constants.AppHttpCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

/**
 * 用户服务 - 模拟用户ID获取
 * 固定返回 user001，用于测试和演示
 * 
 * @author AI Assistant
 * @since 2024-01-01
 */
@Slf4j
@Service
public class UserService {

    /**
     * 固定的用户ID
     */
    private static final String FIXED_USER_ID = "user001";

    /**
     * 获取当前用户ID
     * 优先从SecurityContextHolder获取，如不存在则抛出异常
     * 
     * @return 用户ID
     * @throws SystemException 如果用户未登录，抛出异常
     */
    public String getCurrentUserId() {
        // 先检查用户是否已登录
        if (!isUserLoggedIn()) {
            log.warn("用户未登录，无法获取用户ID");
            throw new SystemException(AppHttpCodeEnum.NEED_LOGIN);
        }
        
        // 尝试从SecurityContextHolder获取用户信息
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        
        if (authentication != null && authentication.isAuthenticated() && authentication.getPrincipal() instanceof SsoUser) {
            SsoUser ssoUser = (SsoUser) authentication.getPrincipal();
            String userId = ssoUser.getLoginName(); // 使用loginName作为用户ID
            log.debug("从SecurityContextHolder获取当前用户ID: {}", userId);
            return userId;
        }
        
        // 如果SecurityContextHolder中没有用户信息，抛出异常
        log.warn("SecurityContextHolder中无用户信息，无法获取用户ID");
        throw new SystemException(AppHttpCodeEnum.NEED_LOGIN);
    }

    /**
     * 获取当前用户ID（从请求中获取，如果为空则使用默认值）
     * 
     * @param requestUserId 请求中的用户ID
     * @return 用户ID
     */
    //public String getCurrentUserId(String requestUserId) {
    //    if (requestUserId != null && !requestUserId.trim().isEmpty()) {
    //        log.debug("使用请求中的用户ID: {}", requestUserId);
    //        return requestUserId;
    //    }
    //    log.debug("请求中用户ID为空，使用默认用户ID: {}", FIXED_USER_ID);
    //    return FIXED_USER_ID;
    //}

    /**
     * 检查用户ID是否有效
     * 
     * @param userId 用户ID
     * @return 是否有效
     */
    public boolean isValidUserId(String userId) {
        return userId != null && !userId.trim().isEmpty();
    }

    /**
     * 获取用户信息
     * 优先从SecurityContextHolder获取，如不存在则抛出异常
     * 
     * @return 用户信息
     * @throws SystemException 如果用户未登录，抛出异常
     */
    public SsoUser getCurrentUser() {
        // 先检查用户是否已登录
        if (!isUserLoggedIn()) {
            log.warn("用户未登录，无法获取用户信息");
            throw new SystemException(AppHttpCodeEnum.NEED_LOGIN);
        }
        
        // 尝试从SecurityContextHolder获取用户信息
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication.isAuthenticated() && authentication.getPrincipal() instanceof SsoUser) {
            SsoUser ssoUser = (SsoUser) authentication.getPrincipal();
            log.debug("从SecurityContextHolder获取当前用户信息: {}", ssoUser.getLoginName());
            return ssoUser;
        }
        
        // 如果SecurityContextHolder中没有用户信息，抛出异常
        log.warn("SecurityContextHolder中无用户信息，无法获取用户信息");
        throw new SystemException(AppHttpCodeEnum.NEED_LOGIN);
    }

    /**
     * 检查用户是否已登录
     * 
     * @return 用户是否已登录
     */
    public boolean isUserLoggedIn() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        boolean isLoggedIn = authentication != null && authentication.isAuthenticated() 
                && !(authentication.getPrincipal() instanceof String && "anonymousUser".equals(authentication.getPrincipal()));
        System.out.println("isUserLoggedIn ++++++++++++++++ authentication==============================:" + authentication);
        log.debug("检查用户登录状态: {}", isLoggedIn);
        return isLoggedIn;
    }

    /**
     * 获取用户权限（模拟）
     * 
     * @return 权限列表
     */
    public String[] getUserPermissions() {
        return new String[]{"chat", "conversation", "message"};
    }
}
